﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using fideeraSoft.DAO;
using System.Data.SqlClient;
using fideeraSoft.Utils;
using fideeraSoft.Entities;

namespace fideeraSoft.DAOimpl
{
    public class ProductoDAOSQLimpl:ProductoDAO
    {       
        #region BUSCAR ULTIMO ID DE PROVEEDOR
        public int buscarNuevoUltimoIdProductoEnBD()
        {
            int ID = 0;
            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "SELECT TOP 1 ID FROM Producto ORDER BY ID DESC ";
                SqlCommand cmd = new SqlCommand(query, conn);

                SQLclass.commandQuery(conn, cmd, query);
                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {

                    while (reader.Read())
                    {
                        ID = reader.GetInt32(0);
                        //  CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] ID : " + ID, CLogger.ERROR);      //DEBUG
                    }
                    ID++;
                }
                else
                {
                    ID = 1;
                }
            }
            catch (Exception e)
            {
                CLogger.Append("[buscarNuevoUltimoIdProductoEnBD] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[buscarNuevoUltimoIdProductoEnBD] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG
            return ID;
        }

        #endregion

        #region BUSCAR PRODUCTO POR NOMBRE
        public Producto buscarProductoPorNombre(string nombre)
        {
            Producto producto = null;
            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "SELECT * FROM Producto WHERE nombre='" + nombre + "'";
                SqlCommand cmd = new SqlCommand(query, conn);

                SQLclass.commandQuery(conn, cmd, query);
                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {
                    producto = new Producto();
                    while (reader.Read())
                    {
                        producto.IdProducto= reader.GetInt32(0);
                        producto.Nombre = reader.GetString(1);
                        if (!reader.IsDBNull(2)) producto.Codigo = reader.GetString(2); else producto.Codigo = "";

                        producto.Descripcion = reader.GetString(3);
                        if (!reader.IsDBNull(4)) producto.Color = reader.GetString(4); else producto.Color = "";
                        if (!reader.IsDBNull(5)) producto.Marca = reader.GetString(5); else producto.Marca = "";
                        
                        //  CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] ID : " + ID, CLogger.ERROR);      //DEBUG
                    }

                }
                else
                {
                    producto = null;
                }
            }
            catch (Exception e)
            {
                CLogger.Append("[buscarProductoPorNombre] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[buscarProductoPorNombre] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG

            return producto;
        }
        #endregion

        #region BUSCAR LISTA PRODUCTO POR NOMBRE
        public List<Producto> buscarListaProductosPorNombre(string nombre)
        {
            List<Producto> lstProducto = null;
            SqlConnection conn = SQLclass.conectarSQL();

            try
            {
                conn.Open();

                string query = "SELECT * FROM Producto WHERE nombre='" + nombre + "'";
                SqlCommand cmd = new SqlCommand(query, conn);

                SQLclass.commandQuery(conn, cmd, query);
                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {              
                    lstProducto=new List<Producto>();
                    while (reader.Read())
                    {
                        Producto producto = new Producto();

                        producto.IdProducto = reader.GetInt32(0);
                        producto.Nombre = reader.GetString(1);
                        if (!reader.IsDBNull(2)) producto.Codigo = reader.GetString(2); else producto.Codigo = "";

                        producto.Descripcion = reader.GetString(3);
                        if (!reader.IsDBNull(4)) producto.Color = reader.GetString(4); else producto.Color = "";
                        if (!reader.IsDBNull(5)) producto.Marca = reader.GetString(5); else producto.Marca = "";

                        lstProducto.Add(producto);
                        //  CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] ID : " + ID, CLogger.ERROR);      //DEBUG
                    }

                }
                else
                {
                    lstProducto= null;
                }
            }
            catch (Exception e)
            {
                CLogger.Append("[buscarListaProductosPorNombre] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[buscarListaProductosPorNombre] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG

            return lstProducto;
        }
        #endregion

        #region BUSCAR PRODUCTO POR NOMBRE Y MARCA
        public Producto buscarProductoPorNombreYMarca(string nombre, string marca)
        {
            Producto producto = null;
            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "SELECT * FROM Producto WHERE nombre='" + nombre + "' AND marca='" + marca + "'";
                SqlCommand cmd = new SqlCommand(query, conn);

                SQLclass.commandQuery(conn, cmd, query);
                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {
                    producto = new Producto();
                    while (reader.Read())
                    {
                        producto.IdProducto = reader.GetInt32(0);
                        producto.Nombre = reader.GetString(1);
                        if (!reader.IsDBNull(2)) producto.Codigo = reader.GetString(2); else producto.Codigo = "";

                        producto.Descripcion = reader.GetString(3);
                        if (!reader.IsDBNull(4)) producto.Color = reader.GetString(4); else producto.Color = "";
                        if (!reader.IsDBNull(5)) producto.Marca = reader.GetString(5); else producto.Marca = "";

                        //  CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] ID : " + ID, CLogger.ERROR);      //DEBUG
                    }

                }
                else
                {
                    producto = null;
                }
            }
            catch (Exception e)
            {
                CLogger.Append("[buscarProductoPorNombreYMarca] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[buscarProductoPorNombreYMarca] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG

            return producto;
        }
        #endregion



        #region BUSCAR PRODUCTO POR MARCA
        public List<Producto> buscarListaProductosPorMarca(string marca)
        {
            
            SqlConnection conn = SQLclass.conectarSQL();
            List<Producto> lstProductos = null;
            try
            {
                conn.Open();

                string query = "SELECT * FROM Producto WHERE marca='" + marca + "'";
                SqlCommand cmd = new SqlCommand(query, conn);

                SQLclass.commandQuery(conn, cmd, query);
                SqlDataReader reader = cmd.ExecuteReader();

                if (reader.HasRows)
                {
                    lstProductos = new List<Producto>();
                    while (reader.Read())
                    {
                        Producto producto = new Producto();

                        producto.IdProducto = reader.GetInt32(0);
                        producto.Nombre = reader.GetString(1);
                        if (!reader.IsDBNull(2)) producto.Codigo = reader.GetString(2); else producto.Codigo = "";

                        producto.Descripcion = reader.GetString(3);
                        if (!reader.IsDBNull(4)) producto.Color = reader.GetString(4); else producto.Color = "";

                        if (!reader.IsDBNull(5)) producto.Marca = reader.GetString(5); else producto.Marca = "";
                        //  CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] ID : " + ID, CLogger.ERROR);      //DEBUG
                        lstProductos.Add(producto);
                    }

                }
                else
                {
                    lstProductos= null;
                }
            }
            catch (Exception e)
            {
                CLogger.Append("[buscarProductoPorMarca] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[buscarProductoPorMarca] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
            // CLogger.Append("[buscarNuevoUltimoIdProveedorEnBD] RETURN ID : " + ID, CLogger.ERROR);      //DEBUG

            return lstProductos;
        }
        #endregion

        #region ALTA PRODUCTO
        public void altaProducto(Producto producto)
        {
            SqlConnection conn = null;
            try
            {
                conn = SQLclass.conectarSQL();
                conn.Open();

                string query = "SET IDENTITY_INSERT Producto ON; INSERT INTO Producto (ID,nombre,codigo,descripcion,color,marca) VALUES (@IdProducto,@Nombre,@Codigo,@Descripcion,@Color,@Marca)";
                //string query = "INSERT INTO Proveedor (razonSocial,responsable,cuil,direccion,localidad,provincia,telefono,celular) VALUES (@RazonSocial,@Responsable,@Cuil,@Direccion,@Localidad,@Provincia,@Telefono,@Celular)";
                SqlCommand cmd = new SqlCommand(query, conn);

                cmd.Parameters.AddWithValue("@IdProducto", producto.IdProducto);
                cmd.Parameters.AddWithValue("@Nombre", producto.Nombre);
                cmd.Parameters.AddWithValue("@Codigo", producto.Codigo);
                cmd.Parameters.AddWithValue("@Descripcion", producto.Descripcion);
                cmd.Parameters.AddWithValue("@Color", producto.Color);
                cmd.Parameters.AddWithValue("@Marca", producto.Marca);

                cmd.ExecuteNonQuery();
                //cmd.Parameters.Clear();
                // cmd.CommandText = "SELECT @@IDENTITY";
                // int insertID=Convert.ToInt32(cmd.ExecuteScalar());

                //  cmd.Dispose();
                cmd = null;

                //cmd.Connection.Close();
                /*DataTable dt = new DataTable();
                DA.Fill(dt);
                */
            }
            catch (Exception e)
            {
                CLogger.Append("[altaProducto] Exception alta: " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[altaProducto] Exception alta: " + e);
            }
            finally
            {
                conn.Close();
            }

        }

        #endregion

        #region Eliminar PRODUCTO POR ID

        public void eliminarProductoPorID(int id)
        {
            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "DELETE FROM Producto WHERE ID='" + id.ToString()+"'";
                SqlCommand cmd = new SqlCommand(query, conn);
                cmd.ExecuteNonQuery();

            }
            catch (Exception e)
            {
                CLogger.Append("[eliminarProductoPorID] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[eliminarProductoPorID] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
        }
        #endregion


        #region Eliminar TODOS LOS PRODUCTos EN DB

        public void eliminarTodosLosProductosEnDb()
        {
            SqlConnection conn = SQLclass.conectarSQL();
            try
            {
                conn.Open();

                string query = "DELETE FROM Producto";
                SqlCommand cmd = new SqlCommand(query, conn);
                cmd.ExecuteNonQuery();

            }
            catch (Exception e)
            {
                CLogger.Append("[eliminarTodosLosProductosEnDb] Exception : " + e, CLogger.ERROR);      //DEBUG
                throw new MiException("[eliminarTodosLosProductosEnDb] Exception: " + e);
            }
            finally
            {
                conn.Close();
            }
        }
        #endregion
    }


}
